﻿<%
'''ashapo系统函数库
'''核心运行所需的基本函数,不允许删除,可在项目中直接使用

'''对变量和对象的赋值方式进行一致性处理，这在目标为未知变量时特别有用
'p_param:要被赋值的变量
'p_value:要赋值的值，可以是任意类型的变量
Function Assign(Byref p_param,  Byval p_value)
	If IsObject(p_value) Then
		Set p_param = p_value
	Else
		p_param = p_value
	End If
End Function


'''判断三元表达式
'p_c:判断条件
'p_t:条件符合时返回值
'p_f:条件未符合返回值
Function IIF(Byval p_c, Byval p_t, Byval p_f)
	If p_c Then
		IIF = p_t
	Else
		IIF = p_f
	End If
End Function

'''二元表达式，如果条件成立则返回某个值,否则返回空字符串
'p_c:判断条件
'p_t:条件符合时返回值
Function IfThen(Byval p_c, Byval p_t)
	IfThen = IIF(p_c, p_t, "")
End Function

'''判断变量是否为空值,支持字符串、数组、记录集、Dictionary等对象
'p_s:要判断的变量
Function IsN(Byval p_s)
	IsN = False
	Select Case VarType(p_s)
	Case vbEmpty, vbNull
		IsN = True : Exit Function
	Case vbString
		If p_s="" Then
			IsN = True : Exit Function
		End If
	Case vbObject
		Select Case TypeName(p_s)
		Case "Nothing","Empty"
			IsN = True : Exit Function
		Case "Recordset"
			If p_s.State = 0 Then
				IsN = True : Exit Function
			End If
			If p_s.Bof And p_s.Eof Then
				IsN = True : Exit Function
			End If
		Case "Dictionary"
			If p_s.Count = 0 Then
				IsN = True : Exit Function
			End If
		End Select
	Case vbArray, 8194, 8204, 8209
		If Ubound(p_s) = -1 Then
			IsN = True : Exit Function
		End If
	End Select
End Function

'''判断变量是否不为空，支持字符串、数组、记录集、Dictionary等对象
'p_s:要判断的变量
Function Has(Byval p_s)
	Has = Not IsN(p_s)
End Function

'''如果某值存在返回某值，否则返回指定值
'p_o:要判断的变量
'p_t:判断值不存在时返回的指定值
Function IfHas(ByVal p_o, ByVal p_t)
	IfHas = IIF(Has(p_o), p_o, p_t)
End Function

'''获取两值的大值
'p_o:第一个值
'p_t:第二个值
Function Max(Byval p_o, Byval p_t)
	Max = IIF(p_o>=p_t, p_o, p_t)
End Function
	
'''获取两值的小值
Function Min(Byval p_o, Byval p_t)
	Min = IIF(p_o<p_t, p_o, p_t)
End Function

'''判断值是否在数组内
'p_s:进行判断的值
'p_a：被判断的数组
Function IsIn(Byval p_s, Byval p_a)
	IsIn = False
	Dim t_i
	For Each t_i In p_a
		If t_i = p_s Then
			IsIn = True : Exit Function
		End If
	Next
End Function

'''模拟php的die函数
'''如果全局AshapoDebug变量为true则会输出具体错误
'p_s:要输出的字符串
Sub Die(Byval p_s)
	'Response.Clear()
	If VarType(ASHAPO_DEBUG) <> vbEmpty And ASHAPO_DEBUG = True Then
		Response.Write("<h1 style='color:red;'>SERIOUS ERROR</h1><p>" & p_s & "</p>")
	Else
		Response.Write("<h1 style='color:red;'>SERIOUS ERROR</h1>")
	End If
	Response.End()
End Sub


'''检测某个服务器组件是否安装
'''todo 待转移
'p_s:组件名
Function IsInstall(Byval p_s)
	On Error Resume Next
	IsInstall = False
	Dim t_o : Set t_o = Server.CreateObject(p_s)
	If Err.Number = 0 Then
		IsInstall = True
	End If
	Set t_o = Nothing
	Err.Clear()
End Function


'''todo 待移除
Function cutLR_(Byval p_s, Byval p_m, Byval p_t)
	Dim t_n : t_n = Instr(p_s, p_m)
	If t_n>0 Then
		If p_t = 0 Then
			cutLR_ = Left(p_s, t_n-1)
		ElseIf p_t = 1 Then
			cutLR_ = Mid(p_s, t_n + Len(p_m))
		End If
	Else
		cutLR_ = p_s
	End If
End Function

'''截取用某个特殊字符(串)分隔的字符串的特殊字符左边部分
'''todo 待移除
'p_s:要截取的字符串
'p_m:特殊字符(串)
Function CLeft(Byval p_s, Byval p_m)
	CLeft = cutLR_(p_s, p_m, 0)
End Function

'''截取用某个特殊字符分隔的字符串的特殊字符右边部分
'''todo 待移除
'p_s:要截取的字符串
'p_m:特殊字符(串)
Function CRight(Byval p_s, Byval p_m)
	CRight = cutLR_(p_s, p_m, 1)
End Function




'''安全化值
'''todo 待移除
'p_s:值
'p_t:预计的类型,(根据该类型进行安全转化)
Function S(Byval p_s, Byval p_t)
	Dim t_s, t_d, t_l, t_r, t_i, t_t, t_a() : t_l = False
	If Instr(p_t, ":")>0 Then
		t_d = CRight(p_t, ":") : p_t = CLeft(p_t, ":")
	End If
	If Instr("sdn", Left(LCase(p_t), 1))>0 Then
		If Len(p_t)>1 Then
			t_s = Mid(p_t,2) : p_t = LCase(Left(p_t, 1)) : t_l = True
		End If
	ElseIf Has(p_t) Then
		t_s = p_t : p_t = "" : t_l = True
	End If
	t_r = Split(p_s, t_s)
	If t_l Then
		Redim t_a(Ubound(t_r))
	End If
	For t_i = 0 To Ubound(t_r)
		If t_i<>0 Then
			t_t = t_t & t_s
		End If
		Select Case p_t
		Case "s"
			If IsN(t_r(t_i)) Then
				t_r(t_i) = t_d
			End If
			t_t = t_t & Replace(t_r(t_i), "'", "''")
			If t_l Then
				t_a(t_i) = Replace(t_r(t_i), "'", "''")
			End If
		Case "d"
			t_t = IIF(IsDate(t_r(t_i)), t_t & t_r(t_i), t_t & t_d)
			If t_l Then
				t_a(t_i) = IIF(IsDate(t_r(t_i)), t_r(t_i), t_d)
			End If
		Case "n"
			t_t = IIF(IsNumeric(t_r(t_i)), t_t & t_r(t_i), t_t & t_d)
			If t_l Then
				t_a(t_i) = IIF(IsNumeric(t_r(t_i)), t_r(t_i), t_d)
			End If
		Case Else
			t_t = IIF(IsN(t_r(t_i)), t_t & t_d, t_t & t_r(t_i))
			If t_l Then
				t_a(t_i) = IIF(IsN(t_r(t_i)), t_d, t_r(t_i))
			End If
		End Select
		If t_l Then
			If IsN(t_a(t_i)) Then
				t_a(t_i) = Empty
			End If
		End If
	Next
	If IsN(t_t) Then
		t_t = Empty
	End If
	S = IIF(t_l, t_a, t_t)
End Function

'''安全GET
'''todo 待移除
Function G(Byval p_s)
	Dim t_s, t_t
	If Instr(p_s,":")>0 Then
		t_t = CRight(p_s,":") : p_s = CLeft(p_s,":")
	End If
	t_s = Request.QueryString(p_s)
	G = S(t_s, t_t)
End Function


'''构造链接
'指定p_num规则id时可以提升性能
Function U(Byval p_u, Byval p_n)
	If C_URL_MODEL = 1 Then
		U = p_u
		Exit Function
	End If
	Dim t_r, t_k, t_u : t_u = p_u
	Set t_r = New RegExp
	t_r.Global = True
	t_r.IgnoreCase = True
	t_r.Multiline = False
	If IsNumeric(p_n) Then
		If C_ROUTE_RULE.Exists(p_n) Then
			t_r.Pattern = C_ROUTE_RULE(p_n)(1)
			If t_r.Test(p_u) Then
				t_u = t_r.Replace(p_u, C_ROUTE_RULE(p_n)(2))
			Else
				t_u = p_u
			End If
		Else
			t_u = p_u
		End If
	Else
		'遍历C_ROUTE_RULE
		For Each t_k In C_ROUTE_RULE
			t_r.Pattern = C_ROUTE_RULE(t_k)(1)
			If t_r.Test(p_u) Then
				t_u = t_r.Replace(p_u, C_ROUTE_RULE(t_k)(2))
				Exit For
			End If
		Next
	End If
	Set t_r = Nothing
	U = t_u
End Function

'把标准时间转换为UNIX时间戳
'''todo 待移除
'参数：strTime:要转换的时间；intTimeZone：该时间对应的时区        
'返回值：strTime相对于1970年1月1日午夜0点经过的秒数        
'示例：ToUnixTime("2008-5-23 10:51:0", +8)，返回值为1211511060        
Function ToUnixTime(strTime, intTimeZone)        
    If IsEmpty(strTime) Or Not IsDate(strTime) Then
		strTime = Now()
	End If
    If IsEmpty(intTimeZone) Or Not isNumeric(intTimeZone) Then
		intTimeZone = 0
	End If
	ToUnixTime = DateAdd("h",-intTimeZone,strTime)        
	ToUnixTime = DateDiff("s","1970-1-1 0:0:0", ToUnixTime)        
End Function       
       
'把UNIX时间戳转换为标准时间
'''todo 待移除    
'参数：intTime:要转换的UNIX时间戳；intTimeZone：该时间戳对应的时区        
'返回值：intTime所代表的标准时间        
'示例：FromUnixTime("1211511060", +8)，返回值2008-5-23 10:51:0        
Function FromUnixTime(intTime, intTimeZone)        
    If IsEmpty(intTime) Or Not IsNumeric(intTime) Then       
		FromUnixTime = Now()        
		Exit Function       
    End If       
	If IsEmpty(intTime) Or Not IsNumeric(intTimeZone) Then
		intTimeZone = 0
	End If
	FromUnixTime = DateAdd("s", intTime, "1970-1-1 0:0:0")        
	FromUnixTime = DateAdd("h", intTimeZone, FromUnixTime)        
End Function
%>